package com.schillerchina.baselibrary.utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class GsonUtil {
    private static Gson gson = null;

    static {
        if (gson == null) {
            gson = new Gson();
        }
    }

    private GsonUtil() {

    }
    /**
     * 将Bean类转换成json字符串
     * 将Bean类转换成json字符串
     * @param object bean类
     * @return 标准JSON字符串
     * 将Bean类转换成json字符串
     */
    public static String GsonString(Object object) {
        String gsonString = null;
        if (gson != null) {
            gsonString = gson.toJson(object);
        }
        return gsonString;
    }

    /**
     * 将JSON字符串“gsonString”反序列化成bean类<T>
     *
     * @param gsonString JSON格式的字符串
     * @param cls bean类
     * @return 为传入的参数cls的类型。如果gsonString为null或空则返回null，如果gsonString中没有相对cls的有效数据则抛出异常JsonSyntaxException。
     */
    public static <T> T GsonToBean(String gsonString, Class<T> cls) {
        T t = null;
        if (gson != null) {
            t = gson.fromJson(gsonString, cls);
        }
        return t;
    }

    /**
     *将JSON字符串gsonString反序列化成bean<T>类数组
     *
     * @param gsonString 必须为jsonArray的字符串
     * @param cls bean类
     * @return 为传入的参数cls类型的list。如果gsonString为null或空则返回null，
     * 如果gsonString中没有相对cls的有效数据则抛出异常JsonParseException。
     * 如果gsonString不是有效的JSON数组则抛出异常JsonSyntaxException
     */
    public static <T> List<T> GsonToList(String gsonString, Class<T> cls) {
        List<T> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
            }.getType());
        }
        return list;
    }

    public static <T> ArrayList<T> GsonToArrayList(String gsonString, Class<T> cls) {
        ArrayList<T> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString, new TypeToken<ArrayList<T>>() {
            }.getType());
        }
        return list;
    }




    public static  <T> ArrayList<T> getDataList(String message, Class<T> cls){ //这里是Class<T>
        ArrayList<T> list = new ArrayList<>();
        String strJson = message;
        if (null == strJson) {
            return list;
        }
        JsonArray jsonArray = new JsonParser().parse(strJson).getAsJsonArray();
        Gson gson = new Gson();
        for (JsonElement jsonElement : jsonArray) {
            list.add(gson.fromJson(jsonElement,cls));
        }
        return list;
    }

    /**
     * 将jsonArray字符串转成map的 数组
     * @param gsonString jsonArray字符串
     * @param cls
     * @param <T>
     * @return map类型的数组，map的vilue 为传入类型
     */
    public static <T> List<Map<String, T>> GsonToListMaps(String gsonString, Class<T> cls) {
        List<Map<String, T>> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString,
                    new TypeToken<List<Map<String, T>>>() {
                    }.getType());
        }
        return list;
    }

    /**
     * 将json字符串转成 map
     * @param gsonString  json字符串
     * @param cls
     * @param <T>
     * @return map类，map的vilue 为传入类型
     */
    public static <T> Map<String, T> GsonToMaps(String gsonString,Class<T> cls) {
        Map<String, T> map = null;
        if (gson != null) {
            map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
            }.getType());
        }
        return map;
    }
    /**
     *获取状态
     */
    private static String messgae;
    private static JSONArray jsonArray;
    public static int getCode(String value){
        int code = 0;
        try {
            JSONObject jsonObject=new JSONObject(value);
            code=jsonObject.getInt("status_code");
//          messgae=jsonObject.getString("message");
            messgae="请求数据异常";
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return code;
    }
    public static int getCodes(String value){
        int code = 0;
        try {
            JSONObject jsonObject=new JSONObject(value);
            code=jsonObject.getInt("resultCode");
//            messgae="请求数据异常";
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return code;
    }


    public static Object getData(String value){
        Object object = 0;
        try {
            JSONObject jsonObject=new JSONObject(value);
            object=jsonObject.getInt("Data");
//            messgae="请求数据异常";
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return object;
    }
    public static String  getInfo(String value){
        String info = "";
        try {
            JSONObject jsonObject=new JSONObject(value);
            info=jsonObject.getString("resultInfo");
//            messgae="请求数据异常";
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return info;
    }
    public  static JSONArray getJsonArray(String value){
        try {
            JSONObject jsonObject=new JSONObject(value);
            jsonArray=jsonObject.getJSONArray("data");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonArray;
    }

    public static String getMessgae() {
        return messgae;
    }


}
